package org.maxkey.portal.core.cam;


import java.io.Serializable;
import java.util.List;
/**
 * Api响应结果信息
 **/
public class ResultData<T> implements Serializable {
	private static final long serialVersionUID = 9142315231410107803L;
	/**
	 * 成功状态
	 * @ignore
	 */
	private static final Integer SUCCESS = 200;
	/**
	 * 成功状态
	 * @ignore
	 */
	private static final String MSG_SUCCESS = "成功";
	/**
	 * 失败状态码
	 * @ignore
	 */
	private static final Integer FAIL = -1;
	/**
	 * 失败状态码
	 * @ignore
	 */
	private static final String MSG_FAIL = "失败";
	/**
	 * 业务错误码
	 */
	private Integer code;
	/**
	 * 描述
	 */
	private String msg;
	/**
	 * 结果集
	 */
	private T data;
	/**
	 * 业务处理成功，但无业务数据
	 */
	public ResultData() {
		this(SUCCESS, MSG_SUCCESS, null);
	}
	/**
	 * 业务处理成功，但有业务数据
	 * @param data 结果数据
	 */
	public ResultData(T data) {
		this(SUCCESS, MSG_SUCCESS, data);
	}
	/**
	 * 默认处理时自定义业务编码，没有业务数据
	 * @param code 错误编码
	 * @param msg  提示消息
	 */
	public ResultData(int code, String msg) {
		this(code, msg, null);
	}
	/**
	 * 默认处理时，自定义业务编码消息和业务数据
	 * @param code 错误编码
	 * @param msg  提示消息
	 */
	public ResultData(int code, String msg, T data) {
		this.setCode(code);
		this.setMsg(msg);
		this.setData(data);
	}
	/**
	 * 自定义返回错误的消息，无业务数据
	 * @param code 错误编码
	 * @param msg  错误消息
	 * @return 错误结果
	 */
	public static <T> ResultData<T> error(int code, String msg) {
		return new ResultData<>(code, msg, null);
	}
	/**
	 * 返回默认错误. 有业务数据
	 * @param msg 错误消息(业务错误)
	 * @return 错误结果
	 */
	public static ResultData<String> error(String msg) {
		return new ResultData<>(FAIL, msg, null);
	}
	/**
	 * 返回默认错误，无业务数据
	 * @return 错误结果
	 */
	public static <T> ResultData<T> error() {
		return error(FAIL, MSG_FAIL);
	}
	/**
	 * 返回自定义成功的消息，无业务数据
	 * @param code 自定义成功编码
	 * @param msg  正确消息
	 * @return 正确结果
	 */
	public static <T> ResultData<T> ok(Integer code, String msg) {
		return new ResultData<T>(code, msg);
	}
	/**
	 * 成功默认成功状态，有业务数据
	 * @param data 业务数据可以是List、Entity等数据
	 * @return 正确结果
	 */
	public static <T> ResultData<T> ok(T data) {
		return new ResultData<>(data);
	}
	/**
	 * 返回默认成功的状态信息，无业务数据
	 * @return 正确结果
	 */
	public static <T> ResultData<T> ok() {
		return new ResultData<>();
	}
	/**
	 * 根据业务条件返回成功或失败的结果,必须保证成功和失败返回的类型是一致的
	 * @param checked 检查条件
	 * @param sucess  条件为true时成功返回的消息
	 * @param fail    条件为false的失败返回的消息
	 * @return 返回结果
	 */
	public static ResultData<String> on(boolean checked, String sucess, String fail) {
		return checked ? ResultData.ok(SUCCESS, sucess) : ResultData.error(FAIL, fail);
	}
	/**
	 * 获取结果编码
	 * @return 结果编码
	 * @author zengxueqi
	 */
	public Integer getCode() {
		return code;
	}
	/**
	 * 设置结果编码
	 * @param code 结果编码
	 * @return
	 * @author missye
	 */
	public ResultData<T> setCode(Integer code) {
		this.code = code;
		return this;
	}
	/**
	 * 获取消息提示
	 * @return 消息提示
	 * @author missye
	 */
	public String getMsg() {
		return msg;
	}
	/**
	 * 设置消息提示
	 * @param msg 消息提示
	 * @return 对象
	 * @author missye
	 */
	public ResultData<T> setMsg(String msg) {
		this.msg = msg;
		return this;
	}
	/**
	 * 获取业务数据
	 * @return 业务数据
	 * @author zengxueqi
	 */
	public T getData() {
		return data;
	}
	/**
	 * 设置业务数据
	 * @param data 业务数据
	 * @return 结果数据
	 * @author missye
	 */
	public ResultData<T> setData(T data) {
		this.data = data;
		return this;
	}
}